package com.sky.chapter3.threadLocal;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * date : 2025-03-20
 * ThreadLocal 适用于如下两种场景
 * 1、每个线程需要有自己单独的实例
 * 2、实例需要在多个方法中共享，但不希望被多线程共享
 * <p>
 * <p>
 * 1）存储用户Session
 * 2) 数据库连接，处理数据库事务
 * 3) 数据跨层传递（controller,service, dao）
 *  todo  如果threadLocal 没有 remove 数据, 会发生什么?
 * @author : wushikai
 */
public class SystemContextClient {

    public static void main(String[] args) {

        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);  //设置线程池线程数量固定为3
        fixedThreadPool.execute(() -> handleReq("1"));
        fixedThreadPool.execute(() -> handleReq("2"));
        fixedThreadPool.execute(() -> handleReq("3"));
        fixedThreadPool.shutdown();
    }

    private static void handleReq(String no) {
        System.out.println("执行任务" + no + "啦");
        new DSqlInterceptor().handleDSql();
        new MerchantController().list();
        SystemContext.removeColumns();   //在整个流程执行完毕后，一定要执行 remove
    }
}

class DSqlInterceptor {
    void handleDSql() {
        HashMap<String, String> paramsMap = new HashMap<>();
        paramsMap.put("merchant_no", "1234" + Thread.currentThread().getName());
        paramsMap.put("merchant_name", "广西卡海网络" + Thread.currentThread().getName());
        SystemContext.setColumns(paramsMap);        //给ThreadLocal赋值，后续的服务直接通过ThreadLocal获取就行了。
    }
}

class MerchantController {
    public void list() {
        new MerchantServiceImpl().page();
    }
}

class MerchantServiceImpl {
    void page() {
        Map columns = SystemContext.getColumns();
        System.out.println("select * from  ftp_vsp_merchant ;  参数" + columns);
    }
}

class SystemContext {
    private static ThreadLocal<Map> columns = new ThreadLocal<>();     //创建ThreadLocal 保存参数;

    static Map getColumns() {
        return columns.get();
    }

    static void setColumns(Map map) {
        columns.set(map);
    }

    static void removeColumns() {
        columns.remove();
    }
}

